#include "pwm_led.h"

// 定时器句柄
 htim3;
// PWM 配置结构体
TIM_OC_InitTypeDef sConfigOC;

// 呼吸灯初始化函数
void PWM_LED_Init(void)
{
    // 使能 TIM3 时钟
    __HAL_RCC_TIM3_CLK_ENABLE();

    htim3.Instance = TIM3;
    // 预分频器，假设系统时钟 72MHz，71 分频后为 1MHz
    htim3.Init.Prescaler = 71;
    // 向上计数模式
    htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
    // 自动重装载值，决定 PWM 频率，这里设置为 1000，PWM 频率为 1kHz
    htim3.Init.Period = 1000;
    htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
    if (HAL_TIM_PWM_Init(&htim3) != HAL_OK)
    {
        Error_Handler();
    }

    sConfigOC.OCMode = TIM_OCMODE_PWM1;
    // 初始占空比为 0
    sConfigOC.Pulse = 0;
    sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
    sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
    if (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
    {
        Error_Handler();
    }

    // 启动 TIM3 通道 1 的 PWM 输出
    HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1);
}

// 呼吸灯效果实现函数
void PWM_LED_Breathe(void)
{
    static uint16_t pwm = 0;
    static uint8_t direction = 1;

    if (direction)
    {
        if (pwm < 1000)
        {
            pwm++;
            // 修改 PWM 占空比
            __HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_1, pwm);
        }
        else
        {
            direction = 0;
        }
    }
    else
    {
        if (pwm > 0)
        {
            pwm--;
            __HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_1, pwm);
        }
        else
        {
            direction = 1;
        }
    }
    HAL_Delay(1);
}